home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
301_400
/
DISK0324
/
DISK0324.ZIP
/
PFORMAT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-02-03
|
27KB
|
965 lines
PROGRAM pFormat (INPUT, OUTPUT);
{
AUTHOR: andy j s decepida
16 Nov 1984
DESCRIPTION: Reads in a .PAS text file and, depending on the user's
choice/s, generates a copy with alterations in the case of
the contained text.
}
CONST
Array_Size = 177;
TYPE
Answer_Set = SET OF CHAR;
Cursor_Size = (Full, Half, Minimum, Invisible);
Global_Strg = STRING[255];
Case_Types = (Upper,
Lower,
AsIs);
VAR
IO_Template,
Work_Template,
Proc_Label,
Mask,
Temp,
Temp_String,
In_File_Name,
Out_File_Name : Global_Strg;
Text_File,
Pretty_Output : TEXT;
Token : ARRAY [1..Array_Size] OF STRING[20];
Res_Case,
Non_Res_Case : Case_Types;
Strt,
Endd,
Indx,
Token_Locn,
Len,
Cnt : INTEGER;
CD_Char,
Prior,
Next : CHAR;
Borland_Convention,
Interruptable,
Comment_Active,
Ok : BOOLEAN;
{*****************************************************************************}
PROCEDURE Init_Array;
{
initialize the reserved word array
Warning: because the primitive parsing method employed here centred
crucially on this array it is NOT recommended that you alter the
contents and sequence of the entries. My apologies non MS-DOS users
for not including the reserved words that their TurboPascal editions do
support. Should you, as say as CP/M Turbo programmer, wish to alter
this table keep in mind two things:
■ Do_Turbo_Extension uses the index (INDX) corresponding to the table
entry of a found reserved word to assign the Borland type setting style
to the output substring ... ergo, keep the new array indices in synch
with the CASE selectors in Do_Turbo_Extension.
■ Since pFORMAT sequentially steps through this array to find a corresponding
pattern occurrences in the text line currently being processed, it
becomes important to keep the shorter reserved words that are embedded in
other, longer reserved words as substrings towards the bottom of the
array!
}
BEGIN {Init_Array}
Token [ 1] := 'ABSOLUTE';
Token [ 2] := 'ARCTAN';
Token [ 3] := 'ASSIGN';
Token [ 4] := 'AUXINPTR';
Token [ 5] := 'AUXOUTPTR';
Token [ 6] := 'BLOCKREAD';
Token [ 7] := 'BLOCKWRITE';
Token [ 8] := 'BOOLEAN';
Token [ 9] := 'BUFLEN';
Token [ 10] := 'CLREOL';
Token [ 11] := 'CLRSCR';
Token [ 12] := 'CONCAT';
Token [ 13] := 'CONINPTR';
Token [ 14] := 'CONOUTPTR';
Token [ 15] := 'CONSTPTR';
Token [ 16] := 'CRTEXIT';
Token [ 17] := 'CRTINIT';
Token [ 18] := 'DELETE';
Token [ 19] := 'DELLINE';
Token [ 20] := 'DOWNTO';
Token [ 21] := 'EXECUTE';
Token [ 22] := 'EXTERNAL';
Token [ 23] := 'FILEPOS';
Token [ 24] := 'FILESIZE';
Token [ 25] := 'FILLCHAR';
Token [ 26] := 'FORWARD';
Token [ 27] := 'FREEMEM';
Token [ 28] := 'FUNCTION';
Token [ 29] := 'GETMEM';
Token [ 30] := 'GOTOXY';
Token [ 31] := 'GRAPHBACKGROUND';
Token [ 32] := 'GRAPHCOLORMODE';
Token [ 33] := 'GRAPHMODE';
Token [ 34] := 'GRAPHWINDOW';
Token [ 35] := 'HEAPSTR';
Token [ 36] := 'HIRESCOLOR';
Token [ 37] := 'INLINE';
Token [ 38] := 'INSERT';
Token [ 39] := 'INSLINE';
Token [ 40] := 'INTEGER';
Token [ 41] := 'IORESULT';
Token [ 42] := 'KEYPRESSED';
Token [ 43] := 'LENGTH';
Token [ 44] := 'LONGFILEPOS';
Token [ 45] := 'LONGFILESIZE';
Token [ 46] := 'LONGSEEK';
Token [ 47] := 'LOWVIDEO';
Token [ 48] := 'LSTOUTPTR';
Token [ 49] := 'MAXAVAIL';
Token [ 50] := 'MAXINT';
Token [ 51] := 'MEMAVAIL';
Token [ 52] := 'NORMVIDEO';
Token [ 53] := 'NOSOUND';
Token [ 54] := 'OUTPUT';
Token [ 55] := 'PACKED';
Token [ 56] := 'PALETTE';
Token [ 57] := 'PROCEDURE';
Token [ 58] := 'PROGRAM';
Token [ 59] := 'RANDOMIZE';
Token [ 60] := 'RANDOM';
Token [ 61] := 'READLN';
Token [ 62] := 'RECORD';
Token [ 63] := 'RELEASE';
Token [ 64] := 'RENAME';
Token [ 65] := 'REPEAT';
Token [ 66] := 'REWRITE';
Token [ 67] := 'SIZEOF';
Token [ 68] := 'STRING';
Token [ 69] := 'TEXTBACKGROUND';
Token [ 70] := 'TEXTCOLOR';
Token [ 71] := 'TEXTMODE';
Token [ 72] := 'UPCASE';
Token [ 73] := 'USRINPTR';
Token [ 74] := 'USROUTPTR';
Token [ 75] := 'WHEREX';
Token [ 76] := 'WHEREY';
Token [ 77] := 'WINDOW';
Token [ 78] := 'WRITELN';
Token [ 79] := 'ARRAY';
Token [ 80] := 'BEGIN';
Token [ 81] := 'CHAIN';
Token [ 82] := 'CLOSE';
Token [ 83] := 'CONST';
Token [ 84] := 'DELAY';
Token [ 85] := 'ERASE';
Token [ 86] := 'FALSE';
Token [ 87] := 'FLUSH';
Token [ 88] := 'HIRES';
Token [ 89] := 'INPUT';
Token [ 90] := 'LABEL';
Token [ 91] := 'MSDOS';
Token [ 92] := 'PORTW';
Token [ 93] := 'RESET';
Token [ 94] := 'ROUND';
Token [ 95] := 'SOUND';
Token [ 96] := 'TRUNC';
Token [ 97] := 'UNTIL';
Token [ 98] := 'WHILE';
Token [ 99] := 'WRITE';
Token [100] := 'ADDR';
Token [101] := 'BYTE';
Token [102] := 'CASE';
Token [103] := 'CHAR';
Token [104] := 'COPY';
Token [105] := 'CSEG';
Token [106] := 'DRAW';
Token [107] := 'DSEG';
Token [108] := 'ELSE';
Token [109] := 'EOLN';
Token [110] := 'FILE';
Token [111] := 'FRAC';
Token [112] := 'GOTO';
Token [113] := 'HALT';
Token [114] := 'INTR';
Token [115] := 'MARK';
Token [116] := 'MEMW';
Token [117] := 'MOVE';
Token [118] := 'PLOT';
Token [119] := 'PORT';
Token [120] := 'PRED';
Token [121] := 'READ';
Token [122] := 'REAL';
Token [123] := 'SEEK';
Token [124] := 'SQRT';
Token [125] := 'SSEG';
Token [126] := 'SUCC';
Token [127] := 'SWAP';
Token [128] := 'TEXT';
Token [129] := 'THEN';
Token [130] := 'TRUE';
Token [131] := 'TYPE';
Token [132] := 'WITH';
Token [133] := 'AND';
Token [134] := 'AUX';
Token [135] := 'CHR';
Token [136] := 'CON';
Token [137] := 'COS';
Token [138] := 'DIV';
Token [139] := 'END';
Token [140] := 'EOF';
Token [141] := 'EXP';
Token [142] := 'FOR';
Token [143] := 'INT';
Token [144] := 'KBD';
Token [145] := 'LST';
Token [146] := 'MEM';
Token [147] := 'MOD';
Token [148] := 'NEW';
Token [149] := 'NIL';
Token [150] := 'NOT';
Token [151] := 'ODD';
Token [152] := 'OFS';
Token [153] := 'ORD';
Token [154] := 'POS';
Token [155] := 'PTR';
Token [156] := 'SEG';
Token [157] := 'SET';
Token [158] := 'SHL';
Token [159] := 'SHR';
Token [160] := 'SIN';
Token [161] := 'SQR';
Token [162] := 'STR';
Token [163] := 'TRM';
Token [164] := 'USR';
Token [165] := 'VAL';
Token [166] := 'VAR';
Token [167] := 'XOR';
Token [168] := 'DO';
Token [169] := 'HI';
Token [170] := 'IF';
Token [171] := 'IN';
Token [172] := 'LN';
Token [173] := 'LO';
Token [174] := 'OF';
Token [175] := 'OR';
Token [176] := 'PI';
Token [177] := 'TO';
END; {Init_Array}
{*****************************************************************************}
PROCEDURE Set_Cursor (Size : Cursor_Size);
{
cursor is set according to the passed Size ... IBM-PC specific!
}
TYPE
Reg_Pack = RECORD
AX, BX, CX, DX, BP, SI, DI, ES, Flags : INTEGER;
END; {of Reg_Pack}
VAR
Rec_Pack : Reg_Pack;
BEGIN
Rec_Pack.AX := $0100; {set cursor type service code ... cf A-47 of
Hardware Technical Reference Manual}
CASE Size OF
Full : Rec_Pack.CX := $000D;
Half : Rec_Pack.CX := $070C;
Minimum : Rec_Pack.CX := $0B0C;
Invisible: Rec_Pack.CX := $2000;
END; {CASE Size OF}
Intr ($10, Rec_Pack) {call video I/O ROM call}
END;
{*****************************************************************************}
FUNCTION Is_Special_Char (Ch : CHAR) : BOOLEAN;
{
TRUE if Ch is a special char
}
BEGIN
Is_Special_Char := (ORD(Ch) IN [32, 39..47, 58..62, 91, 93, 123, 125])
END;
{*****************************************************************************}
FUNCTION Lo_Case (Ch : CHAR) : CHAR;
{
returns lower case of an alpha char
}
BEGIN
IF (Ch IN ['A'..'Z']) THEN
Ch := CHR (ORD(Ch) - ORD('A') + ORD('a'));
Lo_Case := Ch
END;
{*****************************************************************************}
PROCEDURE Up_Strg (VAR Strg : Global_Strg);
VAR
Slot : INTEGER;
BEGIN
IF (LENGTH(Strg) > 0) THEN
FOR Slot := 1 TO LENGTH(Strg) DO
Strg[Slot] := UpCase(Strg[Slot])
END;
{*****************************************************************************}
PROCEDURE Lo_Strg (VAR Strg : Global_Strg);
VAR
Slot : INTEGER;
BEGIN
IF (LENGTH(Strg) > 0) THEN
FOR Slot := 1 TO LENGTH(Strg) DO
Strg[Slot] := Lo_Case(Strg[Slot])
END;
{*****************************************************************************}
FUNCTION Get_Char (Legal_Commands : Answer_Set) : CHAR;
{
waits for a CHAR input belonging in Legal_Commands
}
CONST
Bks = 8;
VAR
Ch_In : CHAR;
BEGIN
WRITE ('[ ]');
WRITE (CHR(Bks), CHR(Bks), ' ',CHR(Bks));
REPEAT
Set_Cursor (Full);
READ (KBD, Ch_In);
Ch_In := UpCase (Ch_In);
IF NOT (Ch_In IN Legal_Commands) THEN
BEGIN
Sound (8900);
Delay (10);
NoSound;
Sound (90);
Delay (30);
NoSound;
END;
UNTIL (Ch_In IN Legal_Commands);
Set_Cursor (Minimum);
Get_Char := Ch_In;
END;
{*****************************************************************************}
FUNCTION User_Says_YES : BOOLEAN;
{
waits for a y/Y or n/N CHAR input
}
VAR
Reply : CHAR;
BEGIN
WRITE (' [y/n] ■ ');
User_Says_YES := (Get_Char(['Y','N']) = 'Y')
END;
{*****************************************************************************}
PROCEDURE Trim_Off (VAR TempStr : Global_Strg);
BEGIN
WHILE POS(' ', TempStr) = 1 DO
DELETE (TempStr, 1, 1);
END;
{*****************************************************************************}
PROCEDURE User_Quits;
BEGIN
Set_Cursor (Minimum);
CrtExit;
ClrScr;
HALT;
END;
{*****************************************************************************}
PROCEDURE Evaluate_User_Choice (ConfirmationTail : Global_Strg;
Reserved : BOOLEAN);
BEGIN {Evaluate_User_Choice}
WRITELN;
WRITE (' You chose ');
TextColor (8); TextBackGround (7);
CASE CD_Char OF
'U' : BEGIN
WRITE ('Upper-case');
IF Reserved THEN
Res_Case := Upper
ELSE
Non_Res_Case := Upper
END;
'L' : BEGIN
WRITE ('Lower-case');
IF Reserved THEN
Res_Case := Lower
ELSE
Non_Res_Case := Lower
END;
'A' : BEGIN
WRITE ('As-Is');
IF Reserved THEN
Res_Case := AsIs
ELSE
Non_Res_Case := AsIs
END;
'B' : BEGIN
WRITE ('Borland type setting');
Borland_Convention := TRUE;
END;
'Q' : User_Quits;
END;
LowVideo;
WRITELN (' ',ConfirmationTail);
WRITE (' Is this correct? ');
END; {Evaluate_User_Choice}
{*****************************************************************************}
PROCEDURE Change_Defaults;
BEGIN {Change_Defaults}
WRITELN;
REPEAT
WRITELN;
WRITELN;
WRITELN (' ■ PASCAL reserved words.');
WRITE (' Options are : U(pper-case, L(ower-case, A(s-Is, Q(uit');
CD_Char := Get_Char (['U','L','A','Q']);
Evaluate_User_Choice ('for the RESERVED words.', TRUE);
UNTIL User_Says_YES;
WRITELN;
REPEAT
WRITELN;
WRITELN;
WRITELN (' ■ Turbo Pascal Extensions.');
WRITE (' Options are : U(pper, L(ower, As-Is, B(o',
'rland type setting, Q(uit');
CD_Char := Get_Char (['U','L','A','B','Q']);
Evaluate_User_Choice ('for the Turbo Pascal Extensions.', TRUE);
UNTIL User_Says_Yes;
WRITELN;
REPEAT
WRITELN;
WRITELN;
WRITELN (' ■ Non-Reserved Words.');
WRITE (' Options are : U(pper-case, L(ower-case, A(s-is, Q(uit');
CD_Char := Get_Char (['U','L','A','Q']);
Evaluate_User_Choice (' for the user defined identifiers.',
FALSE);
UNTIL User_Says_YES;
END; {Change_Defaults}
{*****************************************************************************}
FUNCTION Is_A_Token : BOOLEAN;
{
returns TRUE if the pattern found is properly delimited
}
BEGIN {Is_A_Token}
IF (Token_Locn + LENGTH(Token[Indx])) < Len THEN
Next := COPY (Work_Template,
(Token_Locn + (LENGTH(Token[Indx]))), 1)
ELSE
Next := '.';
IF Token_Locn > 1 THEN
BEGIN
Prior := COPY (Work_Template, Token_Locn - 1, 1);
Is_A_Token := ((Is_Special_Char(Prior)) AND (Is_Special_Char(Next)));
END
ELSE
IF Token_Locn = 1 THEN
Is_A_Token := (Is_Special_Char (Next));
END; {Is_A_Token}
{*****************************************************************************}
PROCEDURE Mask_Out (KeyWord : Global_Strg);
{
mask out a pattern match ... to enable multi-occurrences
}
VAR
Slot : INTEGER;
BEGIN {Mask_Out}
DELETE (Work_Template, Token_Locn, LENGTH(Token[Indx]));
Mask := KeyWord;
FOR Slot := 1 TO LENGTH(KeyWord) DO
Mask[Slot] := '\';
INSERT (Mask, Work_Template, Token_Locn)
END; {Mask_Out}
{*****************************************************************************}
PROCEDURE Do_Turbo_Extension (VAR Extension : Global_Strg);
BEGIN {Do_Turbo_Extension}
CASE Indx OF
1 : Extension := 'Absolute';
3 : Extension := 'Assign';
4 : Extension := 'AuxInPtr';
5 : Extension := 'AuxOutPtr';
9 : Extension := 'BufLen';
10 : Extension := 'ClrEol';
11 : Extension := 'ClrScr';
13 : Extension := 'ConInPtr';
14 : Extension := 'ConOutPtr';
15 : Extension := 'ConstPtr';
16 : Extension := 'CrtExit';
17 : Extension := 'CrtInit';
19 : Extension := 'DelLine';
21 : Extension := 'Execute';
23 : Extension := 'FilePos';
24 : Extension := 'FileSize';
25 : Extension := 'FillChar';
27 : Extension := 'FreeMem';
29 : Extension := 'GetMem';
30 : Extension := 'GotoXY';
31 : Extension := 'GraphBackGround';
32 : Extension := 'GraphColorMode';
33 : Extension := 'GraphMode';
34 : Extension := 'GraphWindow';
35 : Extension := 'HeapStr';
36 : Extension := 'HiResColor';
37 : Extension := 'InLine';
39 : Extension := 'InsLine';
41 : Extension := 'IOResult';
42 : Extension := 'KeyPressed';
44 : Extension := 'LongFilePos';
45 : Extension := 'LongFileSize';
46 : Extension := 'LongSeek';
47 : Extension := 'LowVideo';
48 : Extension := 'LstOutPtr';
49 : Extension := 'MaxAvail';
52 : Extension := 'NormVideo';
53 : Extension := 'NoSound';
56 : Extension := 'Palette';
59 : Extension := 'Randomize';
60 : Extension := 'Random';
64 : Extension := 'Rename';
69 : Extension := 'TextBackGround';
70 : Extension := 'TextColor';
71 : Extension := 'TextMode';
72 : Extension := 'UpCase';
73 : Extension := 'UsrInPtr';
74 : Extension := 'UsrOutPtr';
75 : Extension := 'WhereX';
76 : Extension := 'WhereY';
77 : Extension := 'Window';
81 : Extension := 'Chain';
84 : Extension := 'Delay';
85 : Extension := 'Erase';
87 : Extension := 'Flush';
88 : Extension := 'HiRes';
91 : Extension := 'MSDos';
92 : Extension := 'PortW';
95 : Extension := 'Sound';
100 : Extension := 'Addr';
101 : Extension := 'Byte';
105 : Extension := 'CSeg';
106 : Extension := 'Draw';
107 : Extension := 'DSeg';
111 : Extension := 'Frac';
114 : Extension := 'Intr';
116 : Extension := 'MemW';
117 : Extension := 'Move';
118 : Extension := 'Plot';
119 : Extension := 'Port';
123 : Extension := 'Seek';
124 : Extension := 'Sqrt';
125 : Extension := 'SSeg';
127 : Extension := 'Swap';
134 : Extension := 'Aux';
136 : Extension := 'Con';
144 : Extension := 'Kbd';
145 : Extension := 'Lst';
146 : Extension := 'Mem';
152 : Extension := 'Ofs';
155 : Extension := 'Ptr';
156 : Extension := 'Seg';
158 : Extension := 'ShL';
159 : Extension := 'ShR';
163 : Extension := 'Trm';
164 : Extension := 'Usr';
167 : Extension := 'XOr';
169 : Extension := 'Hi';
173 : Extension := 'Lo';
176 : Extension := 'Pi';
END; {CASE Indx OF}
END; {Do_Turbo_Extension}
{*****************************************************************************}
PROCEDURE Do_Reserved_Word;
BEGIN
Temp := Token [Indx];
DELETE (IO_Template, Token_Locn, LENGTH(Token[Indx]));
IF Res_Case = Lower THEN
Lo_Strg (Temp);
IF Borland_Convention THEN
Do_Turbo_Extension (Temp);
INSERT (Temp, IO_Template, Token_Locn);
END;
{*****************************************************************************}
PROCEDURE TableSearch;
BEGIN
Indx := 1;
REPEAT
Token_Locn := POS (Token[Indx], Work_Template);
IF (Token_Locn <> 0) AND Is_A_Token THEN
BEGIN {pattern match is reserved word}
IF Res_Case <> AsIs THEN
Do_Reserved_Word;
Mask_Out (Token[Indx]);
TableSearch {recurse!!!}
END;
IF Token_Locn <> 0 THEN {pattern match NOT reserved}
Mask_Out (Token[Indx]);
IF Token_Locn = 0 THEN {no pattern match}
Indx := Indx + 1;
UNTIL ( (Indx > Array_Size) AND (Token_Locn = 0) );
END;
{*****************************************************************************}
PROCEDURE Find_Token_Match;
BEGIN {Find_Token_Match}
REPEAT {exhaust all keyword occurrences in a line of text}
TableSearch;
IF Interruptable THEN
IF KeyPressed THEN
BEGIN
TextColor (24); TextBackGround (1);
WRITELN;
WRITE ('Abort pFORMAT of ',In_File_Name,'? ');
IF User_Says_YES THEN
User_Quits
ELSE
DelLine;
LowVideo;
END;
UNTIL Token_Locn = 0;
END; {Find_Token_Match}
{*****************************************************************************}
PROCEDURE Fix_Comment_Strings;
{
mask out comments & strings so as-is chars can be restored from
Temp_String onto IO_Template
}
PROCEDURE Mask_String (Len_Comment : INTEGER);
VAR
Slot : INTEGER;
BEGIN
Temp_String := COPY (Work_Template, Strt, Len_Comment);
FOR Slot := 1 TO LENGTH(Temp_String) DO
Temp_String[Slot] := ' ';
DELETE (Work_Template, Strt, Len_Comment);
INSERT (Temp_String, Work_Template, Strt);
END;
BEGIN {Fix_Comment_Strings}
{do strings}
REPEAT
Strt := POS('''', Work_Template);
IF Strt <> 0 THEN
Work_Template[Strt] := ' ';
Endd := POS ('''', Work_Template);
IF Endd <> 0 THEN
Work_Template[Endd] := ' ';
IF ((Endd <> 0) AND (Strt <> 0)) THEN
Mask_String (Endd - Strt + 1);
UNTIL ((Endd = 0) OR (Strt = 0));
Strt := POS('{', Work_Template);
IF Strt = 0 THEN {check again for alternative delimiter}
Strt := POS ('(*', Work_Template);
Endd := POS('}', Work_Template);
IF Endd = 0 THEN {check again for alternate delimiter}
Endd := POS('*)', Work_Template);
IF Strt <> 0 THEN
Comment_Active := TRUE;
IF Endd <> 0 THEN
Comment_Active := FALSE;
IF Strt = 0 THEN
IF Endd = 0 THEN
IF Comment_Active THEN
BEGIN
Strt := 1;
Mask_String (Len - Strt + 1)
END
ELSE {no active comment}
BEGIN
{do nothing}
END
ELSE {endd <> 0}
BEGIN
Strt := 1;
Mask_String (Endd - Strt + 1)
END
ELSE {strt <> 0}
IF Endd <> 0 THEN
Mask_String (Endd - Strt + 1)
ELSE
Mask_String (Len - Strt + 1);
END; {Fix_Comment_Strings}
{*****************************************************************************}
PROCEDURE Parse;
VAR
Slot : INTEGER;
BEGIN
Work_Template := IO_Template;
Len := LENGTH (IO_Template);
Fix_Comment_Strings;
Up_Strg (Work_Template);
Temp_String := IO_Template;
IF Non_Res_Case = Upper THEN
Up_Strg (IO_Template)
ELSE
IF Non_Res_Case = Lower THEN
Lo_Strg (IO_Template);
FOR Slot := 1 TO LENGTH(IO_Template) DO
IF Work_Template[Slot] = ' ' THEN
IO_Template[Slot] := Temp_String[Slot];
Find_Token_Match;
END;
{*****************************************************************************}
PROCEDURE Verify_Default_Settings;
BEGIN
GotoXY (1,3);
WRITELN;
TextColor (1); TextBackGround (1);
WRITELN ('Output File ',Out_File_Name,'''','s default attributes are :');
LowVideo;
WRITELN (' ■ TurboPASCAL key/reserved words are in UPPER-case letters and');
WRITELN (' ■ Other alphabetic characters are written as is.');
WRITELN;
WRITE ('Would you like to change these defaults ? ');
IF User_Says_YES THEN
Change_Defaults
ELSE
BEGIN
Res_Case := Upper;
Non_Res_Case := Lower;
END;
END;
{*****************************************************************************}
PROCEDURE Banner;
BEGIN
ClrScr;
TextColor (8); TextBackGround (7);
WRITELN (
' Turbo Format [1.01] - @ndyjsdecepid@ 1984 Nov 16 '
);
END;
{*****************************************************************************}
PROCEDURE Get_Input_Name;
BEGIN {Get_Input_Name}
REPEAT
WRITELN;
WRITE ('Name of TurboPASCAL source text file » ');
READLN (In_File_Name);
Trim_Off (In_File_Name);
Up_Strg (In_File_Name);
IF LENGTH(In_File_Name) < 1 THEN
User_Quits;
ASSIGN (Text_File, In_File_Name);
{$I-} RESET (Text_File) {$I+};
Ok := (IOResult = 0);
IF NOT Ok THEN
BEGIN
Sound (6099);
Delay (500);
Sound (600);
NoSound;
WRITE ('Cannot find file ');
NormVideo;
WRITE (In_File_Name);
LowVideo;
END
UNTIL Ok;
END; {Get_Input_Name}
{*****************************************************************************}
PROCEDURE Get_Output_Name;
BEGIN {Get_Output_Name};
REPEAT
WRITELN;
WRITE ('Name of pFORMAT generated file » ');
READLN (Out_File_Name);
Trim_Off (Out_File_Name);
Up_Strg (Out_File_Name);
IF LENGTH (Out_File_Name) < 1 THEN
User_Quits;
ASSIGN (Pretty_Output, Out_File_Name);
{$I-} REWRITE (Pretty_Output) {$I+};
Ok := (IOResult = 0);
IF NOT Ok THEN
BEGIN
WRITELN;
Sound (6099);
Delay (500);
Sound (600);
NoSound;
WRITE ('Unable to open file ');
NormVideo;
WRITE (Out_File_Name);
LowVideo;
END;
UNTIL Ok;
END; {Get_Input_Name}
{*****************************************************************************}
BEGIN {--------------------------------------------------------------- pFormat}
Init_Array;
REPEAT
Window (1, 1, 80, 25);
GotoXY (1,1);
ClrScr;
Borland_Convention := FALSE;
Comment_Active := FALSE;
Banner;
Window (1, 2, 80, 24);
ClrScr;
LowVideo;
WRITELN;
WRITE ('■ To quit, press a lone ',CHR(17),'┘ in response to the prompts');
WRITELN (' for file names.');
WRITELN;
Get_Input_Name;
Get_Output_Name;
Window (1, 1, 80, 24);
GotoXY (1,1);
Banner;
Window (1, 2, 80, 24);
Verify_Default_Settings;
NormVideo;
WRITELN;
WRITELN;
WRITE ('Would you like to be able to abort this run with a keypress?');
Interruptable := User_Says_YES;
LowVideo;
Window (1, 1, 80, 24);
GotoXY (1,1);
Banner;
GotoXY (1,3);
TextColor (16); TextBackGround (1);
Proc_Label := CONCAT ('Reading ',In_File_Name,' & generating ',
Out_File_Name);
IF (LENGTH (Proc_Label) <= 80) THEN {centre if it fits 80-char line}
WRITE (Proc_Label:((80 + LENGTH(Proc_Label)) DIV 2))
ELSE
WRITE (Proc_Label);
GotoXY (1,5);
NormVideo;
FOR Cnt := 1 TO 80 DO
WRITE ('═');
LowVideo;
Window (1, 6, 80, 23);
ClrScr;
Set_Cursor (Invisible);
WHILE NOT (EOF(Text_File)) DO
BEGIN
READLN (Text_File, IO_Template);
Parse;
WRITELN (IO_Template);
WRITELN (Pretty_Output, IO_Template);
END;
Set_Cursor (Minimum);
CLOSE (Text_File);
CLOSE (Pretty_Output);
ClrScr;
WRITELN;
WRITE ('Quit pFORMAT');
UNTIL User_Says_YES;
END. {---------------------------------------------------------------pFormat}